import { SetMetadata } from '@nestjs/common';

/*
  如果需要处理一些特殊场景，可以在参数最后一位传递模式
  示例：
  @ReqType( moduleType, authType )
    表示 具备 [moduleType]模块 中 [authType]权限 时，可以访问
    authType 为 'read'时，可以省略
  @ReqType( moduleType, authType, OR )
    此时 authType 格式为 'read|create|modify|...'
    表示 具备 [moduleType]模块 中 read,create,modify,... 中的任一权限可以访问
  @ReqType( moduleType, authType, AND )
    此时 authType 格式为 'read&create&modify&...'
    表示 同时具备 [moduleType]模块 中 read,create,modify,... 中的全部权限可以访问
  @ReqType( moduleType1, authType1, moduleType2, authType2, MIX_AND )
    表示 同时具备 [moduleType1]模块 中的 [authType1] 和 [moduleType2]模块 中的 [authType2] 权限时可以访问
    当前方式中 authType仅支持解析单个权限，如有需要可后续扩展
*/

// 定义权限相关 symbol
type ArgeTypes =
  | [string]
  | [string, string]
  | [string, string, symbol]
  | [string, string, string, string, symbol];

// export const OR = 'MOVEBROAD_AUTH_OR';
// export const AND = 'MOVEBROAD_AUTH_AND';
// export const MIX_AND = 'MOVEBROAD_AUTH_MIX_AND';
export const OR = Symbol.for('or');
export const AND = Symbol.for('and');
export const MIX_AND = Symbol.for('mix_and');

// export const ReqType = (...args: string[]) => SetMetadata('reqtype', args);
export const ReqType = (...args: ArgeTypes) => SetMetadata('reqtype', args);
